#include <iostream>
using std::cout;
using std::endl;

class Grandpa
{
    //在当前类中存在多个虚函数，那么一共有多少个虚函数指针，多少个虚函数表？？？1个
    //虚函数表实际上是一个数组，是可以存储多个虚函数的入口地址的
public:
    Grandpa(){ cout << "Grandpa()" << endl; }
    ~Grandpa(){ cout << "~Grandpa()" << endl; }

    virtual void func1() {
        cout << "Grandpa::func1()" << endl;
    }

    virtual void func2(){
        cout << "Grandpa::func2()" << endl;
    }
};
//Parent中的虚函数表继承自GrandPa，内容和GrandPa一致的
class Parent
: public Grandpa
{
public:
    Parent()
    :Grandpa()
    {
        cout << "Parent()" << endl;
        func1();//构造函数中调用虚函数
    }

    ~Parent(){
        cout << "~Parent()" << endl;
        func2();//析构函数中调用虚函数
    }
};
//son继承了虚函数表之后，进行了覆盖，覆盖了入口地址，变为自己的虚函数地址
class Son
: public Parent
{
public:
    Son()
    :Parent()
    { cout << "Son()" << endl; }
    ~Son() { cout << "~Son()" << endl; }

    virtual void func1() override {
        cout << "Son::func1()" << endl;
    }

    virtual void func2() override{
        cout << "Son::func2()" << endl;
    }
};


void test(){
    //即便中间的这个基类没有做任何处理，那么依然是满足多态的
    Son ss;
    Grandpa * p = &ss;
    p->func1();
    p->func2();
}

int main()
{
    test();
    return 0;
}

